package com.sixmac.utils;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

/**
 * 图片压缩工具类
 * 提供的方法中可以设定生成的缩略图片的大小尺寸等
 */
public class ThumbUtil {

    /**
     * 指定大小进行缩放
     *
     * @param srcUrl    源图片地址
     * @param targetUrl 目标图片地址
     * @param width     宽
     * @param height    高
     * @throws IOException
     */
    public static void resize(String srcUrl, String targetUrl, int width, int height) throws IOException {
        /*
         * size(width,height) 若图片横比200小，高比300小，不变
         * 若图片横比200小，高比300大，高缩小到300，图片比例不变 若图片横比200大，高比300小，横缩小到200，图片比例不变
         * 若图片横比200大，高比300大，图片按比例缩小，横为200或高为300
         */
        Thumbnails.of(srcUrl).size(width, height).toFile(targetUrl);
    }


    /**
     * 按照比例进行缩放
     *
     * @param srcUrl    源图片地址
     * @param targetUrl 目标图片地址
     * @param num       质量比例如 0.8
     * @throws IOException
     */
    public static void scale(String srcUrl, String targetUrl, double num) throws IOException {
        Thumbnails.of(srcUrl).scale(num).toFile(targetUrl);
    }

    /**
     * 水印
     *
     * @param srcUrl    源图片地址
     * @param targetUrl 目标图片地址
     * @param width     宽
     * @param height    高
     * @param num       质量比例如 0.8
     * @param pos       显示位置:  Positions.BOTTOM_RIGHT
     * @throws IOException
     */
    public static void waterMark(String srcUrl, String targetUrl, int width, int height, float num, Positions pos) throws IOException {
        Thumbnails.of(srcUrl).size(width, height).watermark(pos, ImageIO.read(new File(targetUrl)), num).outputQuality(num).toFile(targetUrl);
    }

    /**
     * 裁剪
     *
     * @param srcUrl    源图片地址
     * @param targetUrl 目标图片地址
     * @param width     宽
     * @param height    高
     * @param pos       显示位置:  Positions.BOTTOM_RIGHT
     * @param x         区域宽度
     * @param y         区域高度
     * @throws IOException
     */
    public static void cut(String srcUrl, String targetUrl, int width, int height, Positions pos, int x, int y) throws IOException {
        Thumbnails.of(srcUrl).sourceRegion(pos, x, y).size(width, height).keepAspectRatio(false).toFile(targetUrl);
    }


    /**
     * 裁剪--指定坐标/大小
     *
     * @param srcUrl    源图片地址
     * @param targetUrl 目标图片地址
     * @param width     宽
     * @param height    高
     * @param pointA_1  坐标A1
     * @param pointA_2  坐标A2
     * @param pointB_1  坐标B1
     * @param pointB_2  坐标B2
     * @throws IOException
     */
    public static void cut(String srcUrl, String targetUrl, int width, int height, int pointA_1, int pointA_2, int pointB_1, int pointB_2) throws IOException {
        Thumbnails.of(srcUrl).sourceRegion(pointA_1, pointA_2, pointB_1, pointB_2).size(width, height).keepAspectRatio(false).toFile(targetUrl);
    }

    /**
     * 转化图像格式
     *
     * @param srcUrl    源图片地址
     * @param targetUrl 目标图片地址
     * @param width     宽
     * @param height    高
     * @param format    格式 如png/gif/jpg
     * @throws IOException
     */
    public static void format(String srcUrl, String targetUrl, int width, int height, String format) throws IOException {
        Thumbnails.of(srcUrl).size(width, height).outputFormat(format).toFile(targetUrl);
    }

    public static void main(String[] args) {
        try {
            //图片尺寸不变，压缩图片文件大小outputQuality实现,参数1为最高质量
            File file = new File("D:\\pic.jpg");
            double len = file.length();
            double scale = 204800.0 / len;
            scale("D:\\pic.jpg", "D:\\new.jpg", scale);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 
